// 版权所有 2017 David Conran

/// @file
/// @brief 支持美的（Midea）协议。
/// 美的协议由crankyoldgit和bwze添加
/// @see https://docs.google.com/spreadsheets/d/1TZh4jWrx4h9zzpYUI9aYXMl1fYOiqu-xVuOOMqagxrs/edit?usp=sharing
/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1342#issuecomment-733721085
/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1733

// 支持的设备：
//   品牌：先锋系统（Pioneer System），型号：RYBO12GMFILCAD 空调（12K BTU）（美的）
//   品牌：先锋系统（Pioneer System），型号：RUBO18GMFILCAD 空调（18K BTU）（美的）
//   品牌：先锋系统（Pioneer System），型号：WS012GMFI22HLD 空调（12K BTU）（美的）
//   品牌：先锋系统（Pioneer System），型号：WS018GMFI22HLD 空调（12K BTU）（美的）
//   品牌：先锋系统（Pioneer System），型号：UB018GMFILCFHD 空调（12K BTU）（美的）
//   品牌：先锋系统（Pioneer System），型号：RG66B6(B)/BGEFU1 遥控器（美的）
//   品牌：康夫（Comfee），型号：MPD1-12CRN7 空调（美的）
//   品牌：凯顺（Kaysun），型号：Casual CF 空调（美的）
//   品牌：基斯通（Keystone），型号：RG57H4(B)BGEF 遥控器（美的）
//   品牌：酷先生（MrCool），型号：RG57A6/BGEFU1 遥控器（美的）
//   品牌：美的（Midea），型号：FS40-7AR 落地扇（MIDEA24）
//   品牌：丹佛（Danby），型号：DAC080BGUWDB（美的）
//   品牌：丹佛（Danby），型号：DAC100BGUWDB（美的）
//   品牌：丹佛（Danby），型号：DAC120BGUWDB（美的）
//   品牌：丹佛（Danby），型号：R09C/BCGE 遥控器（美的）
//   品牌：特罗特克（Trotec），型号：TROTEC PAC 2100 X（美的）
//   品牌：特罗特克（Trotec），型号：TROTEC PAC 3900 X（美的）
//   品牌：特罗特克（Trotec），型号：RG57H(B)/BGE 遥控器（美的）
//   品牌：特罗特克（Trotec），型号：RG57H3(B)/BGCEF-M 遥控器（美的）
//   品牌： Lennox，型号：RG57A6/BGEFU1 遥控器（美的）
//   品牌： Lennox，型号：MWMA009S4-3P 空调（美的）
//   品牌： Lennox，型号：MWMA012S4-3P 空调（美的）
//   品牌： Lennox，型号：MCFA 室内分体式空调（美的）
//   品牌： Lennox，型号：MCFB 室内分体式空调（美的）
//   品牌： Lennox，型号：MMDA 室内分体式空调（美的）
//   品牌： Lennox，型号：MMDB 室内分体式空调（美的）
//   品牌： Lennox，型号：MWMA 室内分体式空调（美的）
//   品牌： Lennox，型号：MWMB 室内分体式空调（美的）
//   品牌： Lennox，型号：M22A 室内分体式空调（美的）
//   品牌： Lennox，型号：M33A 室内分体式空调（美的）
//   品牌： Lennox，型号：M33B 室内分体式空调（美的）

#ifndef IR_MIDEA_H_
#define IR_MIDEA_H_

#include <stdint.h>
#include "ir_air_conditioner.h"
// 定义R05D协议数据长度（6字节 = 48位）
#define kMideaR05DStateLength 6
#define kMideaR05DBits        (kMideaR05DStateLength * 8)

union MideaR05DProtocol {
    uint8_t raw[kMideaR05DStateLength]; ///< 原始数据（A, A', B, B', C, C'）
    struct {
        // 字节0: 识别码A（协议定义A=0xB2或预留A=0xB7）
        uint8_t A : 8;

        // 字节1: A的反码（A' = ~A & 0xFF）
        uint8_t A_inv : 8;

        // 字节2: 功能码B（高3位=风速，低5位=固定值0x1F）
        struct {
            uint8_t Fixed : 5; ///< 固定值 (必须为0x1F)
            uint8_t Fan   : 3; ///< 风速位 (B7-B5)
        } B;

        // 字节3: B的反码（B' = ~B & 0xFF）
        uint8_t B_inv : 8;

        // 字节4: 功能码C（包含电源、模式、温度等）
        struct {
            uint8_t Fixed : 2; ///< 固定值 (必须为0b00)
            uint8_t Mode  : 2; ///< 运行模式（kMideaAc*）
            uint8_t Temp  : 4; ///< 温度值（16-30°C，实际值=Temp+17）
        } C;

        // 字节5: C的反码（C' = ~C & 0xFF）
        uint8_t C_inv : 8;
    };
};
// 逻辑0：560us高 + 560us低
// 逻辑1：560us高 + 1690us低
#define MideaR05_0_DHIGH_US 550 ///< 0高电平时间
// #define MideaR05_0_DHIGH_US 700 ///< 0高电平时间
#define MideaR05_0_LOW_US 550 ///<  0低电平时间
// #define MideaR05_0_LOW_US   400 ///<  0低电平时间
#define MideaR05_1_DHIGH_US 550  ///< 1高电平时间
#define MideaR05_1_LOW_US   1670 ///<  1低电平时间

/* 关机为固定编码键值：
  A=1011 0010 --0xB2
  B=0111 1011 --0x7B
  C=1110 0000 --0xE0*/
// ==================== MideaR05D协议常量 ====================
#define kMideaR05DCodeA 0xB2 ///< 关机编码

#define kMideaR05DOffCodeB 0x7B ///< 关机编码
#define kMideaR05DOffCodeC 0xE0 ///< 关机编码

// 温度范围
#define kMideaR05DMinTempC (17) ///< 摄氏最低温度
#define kMideaR05DMaxTempC (30) ///< 摄氏最高温度
#define kMideaR05DDefTempC (25) ///< 默认摄氏温度

// 空调运行模式
#define kMideaAcAuto 2 ///< 自动模式
#define kMideaAcCool 0 ///< 制冷模式
#define kMideaAcDry  1 ///< 除湿模式
#define kMideaAcHeat 3 ///< 制热模式
#define kMideaAcFan  1 ///< 送风模式
//风速
#define kMideaAcFanAuto  5 ///< 自动   0b101
#define kMideaAcFanLow   4 ///< 低风速 0b100
#define kMideaAcFanMed   2 ///< 中风速 0b010
#define kMideaAcFanHigh  1 ///< 高风速 0b001
#define kMideaAcFanFixed 0 ///< 固定   0b000

pAir_conditioner_t midea_r05d_init(void);
#endif // IR_MIDEA_H_